/*********************************************************************************************************************
版权所有 (C), 2021,
设计：山亦青
编码：山亦青
版本：V1.0.0.0
完成日期：2021.4.1
说明:
 标准键盘的头文件。
 触摸屏不配键盘，所以需要自己开发一个虚拟键盘。
 这个模块还需要优化，因为键盘的宽高度是写死的。
代码级别：u
*********************************************************************************************************************/

#ifndef VIRTUALKEYBOARD_H
#define VIRTUALKEYBOARD_H

#include <QDialog>
#include <Base.h>
#include <QLabel>
#include "GradientButton.h"

// 下面2个常量，被用于setCase方法
#define VK_ALLOW_BIG_LETTER 0X02 //允许大写字母
#define VK_ALLOW_SMALL_LETTER 0X01 //允许小写字母

// 下面1个常量，被用于setMaxLength方法
#define VK_INPUT_INFI -1 //表示不限长度

class VirtualKeyboard : public QDialog
{
    Q_OBJECT

public:
    VirtualKeyboard();

    virtual ~VirtualKeyboard();

    // 设置大小写使能
    // 参数1：caseToSet，是否允许大小写，由VK_ALLOW_BIG_LETTER和VK_ALLOW_SMALL_LETTER，
    Void_t setCase(Int32_t caseToSet);

    // 设置是否为密码
    // 参数1：isPassword，是否为密码，默认是false
    Void_t setPassword(Bool_t isPassword);

    // 设置长度上限
    // 参数1：要设置的长度值，特殊值为VK_INPUT_INFI，表示无限长度
    Void_t setMaxLength(Int32_t len);

    // 设置初始值
    // 参数1：initValue，初始值，默认为空字符串
    Void_t setInitValue(Constant QString& initValue);

    // 设置字段名
    // 参数1：filedName，字段名，默认空字符串
    Void_t setFieldName(Constant QString& fieldName);

    // 显示模式对话框
    // 参数1：left，父级组件的左边距
    // 参数2：top，父级组件的上边距
    Void_t doModal(Length_t left, Length_t top);

    //复位虚拟键盘，把所有设置全部恢复成初始化
    Void_t resetKeyBoard();

signals:
    // 用户确认输入时触发的信号(点击"确认"按钮触发)
    // 参数1：newText，修改后的新值
    void onInputFinish(Constant QString& newText);

    // 用户取消输入时触发的信号(点击"取消"按钮触发)
    // 参数1：oldText
    void onInputCancel(Constant QString& oldText);

    // 当输入内容改变时触发的信号
    void onInputChanged(Constant QString& newText);

protected:
    void paintEvent(QPaintEvent* pEvent);

private:
    Int32_t m_Case; //大小写限制
    Bool_t m_IsPwd; //是否为密码
    Int32_t m_InputMaxLen; //最大输入长度
    QString m_InitValue; //初始值
    QString m_InputValue; //输入值
    QString m_FieldName; //字段名
    Bool_t m_CurrentIsSmall; //当前是否为小写输入状态，true表示小写，false表示大写
    Void_t updateLetters(); //更新所有字母键，当大小写切换时，需调用这个函数
    Void_t updateInputValue(); //更新输入内容

    //下面是各种按钮
    // 字符键，第1~10个字符表示数字0~9
    // 第10~36表示a~z的字符
    // 第37表示空格
    GradientButton m_CharKeys[37];

    // 大小写切换键
    GradientButton m_ShiftKey;

    // 退格键
    GradientButton m_BackSpaceKey;

    // 清空键
    GradientButton m_ClearInputKey;

    // 确认按钮
    GradientButton m_OKKey;

    // 取消按钮
    GradientButton m_CancelKey;

    //字段的标签
    QLabel m_FieldLabel;

    //输入值的标签
    QLabel m_ValueLabel;

public slots:
    void onCharacterKeyDown(const GradientButton* pKey); //m_CharKeys中任意一个键位被按下时的响应函数

    void onShiftKeyDown(const GradientButton* pKey); //大小写切换的响应事件

    void onBackSpaceKeyDown(const GradientButton* pKey); //退格键的响应事件

    void onClearKeyDown(const GradientButton* pKey); //清空键的响应事件

    void onOK(const GradientButton* pKey); //清空键的响应事件

    void onCancel(const GradientButton* pKey); //清空键的响应事件
};

#endif // VIRTUALKEYBOARD_H
